#!/bin/bash

# Prisma 客户端生成脚本
# 用于生成和更新 Prisma 客户端及类型定义

echo "🔄 开始生成 Prisma 客户端..."

# 确保在正确的目录
if [ ! -f "prisma/schema.prisma" ]; then
  echo "❌ 错误: 未找到 schema.prisma 文件"
  echo "请在项目根目录运行此脚本"
  exit 1
fi

# 检查必要工具
echo "🔍 检查环境..."
if ! command -v npx &> /dev/null; then
  echo "❌ 错误: 未找到 npx"
  echo "请安装 Node.js 和 npm"
  exit 1
fi

# 清理旧的生成文件
echo "🧹 清理旧的生成文件..."
rm -rf node_modules/.prisma
rm -rf node_modules/@prisma/client

# 检查和安装 Prisma 依赖
echo "📦 检查 Prisma 依赖..."
npm ls prisma || npm install --save-dev prisma
npm ls @prisma/client || npm install @prisma/client

# 设置生成选项
SCHEMA_PATH="./prisma/schema.prisma"
GENERATOR_CONFIG="generator client {
  provider = \"prisma-client-js\"
  previewFeatures = [\"interactiveTransactions\"]
  engineType = \"binary\"
}"

# 检查生成器配置
if ! grep -q "generator client" "$SCHEMA_PATH"; then
  echo "⚙️ 添加生成器配置..."
  echo -e "\n$GENERATOR_CONFIG" >> "$SCHEMA_PATH"
fi

# 验证 schema
echo "✔️ 验证 Schema..."
npx prisma validate

if [ $? -ne 0 ]; then
  echo "❌ Schema 验证失败"
  exit 1
fi

# 格式化 schema
echo "📝 格式化 Schema..."
npx prisma format

# 生成客户端
echo "🏗️ 生成 Prisma 客户端..."
npx prisma generate

if [ $? -ne 0 ]; then
  echo "❌ 客户端生成失败"
  exit 1
fi

# 生成类型定义文件
echo "📝 生成类型定义文件..."
cat > src/types/prisma-types.ts << EOF
/**
 * Prisma 类型定义文件
 * 此文件由 generate-prisma.sh 自动生成
 * 请勿手动修改
 */

export * from '@prisma/client'

// 自定义类型扩展
declare global {
  namespace PrismaTypes {
    export type { PrismaClient } from '@prisma/client'
  }
}
EOF

# 生成索引文件
echo "📑 更新类型索引..."
cat > src/types/index.ts << EOF
export * from './prisma-types'
export * from './auth'
export * from './evaluation'
export * from './question'
export * from './audit'
EOF

# 生成 Prisma 客户端单例
echo "🔧 生成 Prisma 客户端单例..."
cat > src/lib/prisma.ts << EOF
/**
 * Prisma 客户端单例
 * 此文件由 generate-prisma.sh 自动生成
 * 请勿手动修改
 */

import { PrismaClient } from '@prisma/client'
import { info, error } from '../utils/logger'

declare global {
  var prisma: PrismaClient | undefined
}

export const prisma = global.prisma || new PrismaClient({
  log: [
    { emit: 'event', level: 'query' },
    { emit: 'event', level: 'error' },
    { emit: 'event', level: 'warn' }
  ]
})

// 事件监听
prisma.$on('query', (e) => {
  info('Query:', { query: e.query, params: e.params, duration: e.duration })
})

prisma.$on('error', (e) => {
  error('Prisma Error:', { error: e })
})

prisma.$on('warn', (e) => {
  error('Prisma Warning:', { warning: e })
})

if (process.env.NODE_ENV !== 'production') {
  global.prisma = prisma
}

export default prisma
EOF

echo "✨ 生成完成!"
echo -e "\n📝 生成的文件:"
echo "• Prisma 客户端:    node_modules/@prisma/client"
echo "• 类型定义:        src/types/prisma-types.ts"
echo "• 客户端单例:      src/lib/prisma.ts"

echo -e "\n💡 后续步骤:"
echo "1. 检查生成的文件是否正确"
echo "2. 确认类型定义已正确导出"
echo "3. 运行测试确保一切正常"

echo -e "\n⚠️  注意事项:"
echo "• 每次修改 schema.prisma 后都需要重新运行此脚本"
echo "• 生成的文件不应手动修改"
echo "• 自定义类型应在单独的文件中定义"

# 提示运行测试
echo -e "\n❓ 是否要运行测试来验证生成的客户端? (y/n)"
read -r answer

if [[ "$answer" =~ ^[Yy]$ ]]; then
  npm test
fi
